На прием к
доктору каждый день приходит много людей. Каждый пациент находится на приеме
целое число минут, однако разных пациентов доктор может принимать разное
количество времени. Доктор начинает прием в момент времени t1 минут и заканчивает прием в момент времени t2 минут. Это означает, что
любой пациент независимо от того, сколько времени его будет принимать доктор,
может зайти на прием в моменты t1,
t1 + 1, …, t2 − 1. Заходить на
прием к доктору в другое время или тогда, когда доктор принимает другого
пациента, запрещено. Если пациент приходит в поликлинику в момент t, он ожидает первый момент времени s ≥ t такой, что на этот момент доктор ведет прием, причем уже успел
осмотреть всех пациентов, которые пришли в поликлинику раньше, то есть до
момента t. Если доктор не успевает
осмотреть всех до конца приема, то остаток пациентов должен прийти на следующий
день.
Зная, в какой
момент доктор начинает и заканчивает прием, те, кто и когда придут на прием в
конкретный день, а также сколько времени будет осматривать доктор каждого
пациента, определите момент времени, в который необходимо прийти на прием Пете
Пяточкину, чтобы гарантированно попасть в этот день к доктору, и при этом
ожидать приема как можно меньше. В случае, если имеется несколько
альтернативных вариантов такого момента времени, Вам необходимо определить
наименьший (наиболее ранний) из них.
Вход. В первой строке приведено три числа: количество желающих
попасть на прием n, время начала
приема t1 и время
завершения приема t2,
больший чем t1.
Во второй строке перечислены n чисел a1, a2, …, an – время, когда в поликлинику зашли соответственно
первый, второй, …, n-ый желающий
попасть к доктору. Числа a1,
a2, …, an попарно различны и
расположены в порядке возрастания.
В третьей строке перечислены n чисел b1, b2, …, bn – время, необходимое доктору на осмотр соответственно
первого, второго, …, n-го пациента.
Все входные числа натуральные. Количество пациентов n не больше 105, остальные
числа не превосходят 109.
Сутки на планете, где проживает Петя Пяточкин, длятся
значительно дольше, чем на Земле, поэтому время начала приема t1, время завершения приема t2, а также числа a1, a2, …, an
и b1, b2, …, bn
могут быть большими чем 1440 – количество минут в земных сутках.
Выход. Вывести
наименьший момент времени, когда Петя Пяточкин должен прийти в поликлинику,
чтобы гарантированно попасть к доктору, подождав приема как можно меньше
времени. Если Петя придет одновременно с другим человеком, его как младшего
пропустят вперед.
Пример
входа |
Пример
выхода |
5 10 20 4 9 12 16 22 4 10 10 9 2 |
9 |
жадные
алгоритмы
Анализ алгоритма
Если до момента
времени t1 посетителей не
было, то Петя Пяточкин может прийти к доктору в t1. Вычислим для каждого больного время его попадания si к врачу. Если для
некоторого i имеет место неравенство si + bi ≤ ai+1,
то Петя может прийти в момент времени si
+ bi, попав сразу к врачу
без ожидания. В противном случае Пете придется ждать. Причем если он придет в
момент ai, то ждать
придется si – ai минут. Находим i, для которого указанная разность
минимальна.
Реализация
алгоритма
Массив а
содержит время прихода пациентов в поликлинику, массив b время приема пациентов
доктором. s[i] содержит время, когда i-ый пациент сможет попасть на прием к
доктору.
#define MAX 100002
int a[MAX], b[MAX], s[MAX];
Читаем входные данные.
scanf("%d %d %d",&n,&t1,&t2);
for(i = 1; i <= n; i++)
scanf("%d",&a[i]);
for(i = 1; i <= n; i++)
scanf("%d",&b[i]);
Если первый пациент приходит в
поликлинику не раньше времени t1, когда доктор начинает прием, то Петя может прийти во время t1 и сразу попасть к врачу.
if (a[1] >= t1)
{
printf("%d\n",t1);
return 0;
}
Первый пациент сможет попасть к
доктору в момент времени t1.
s[1] = t1;
a[n+1] = t2;
for(i = 1; i <= n; i++)
{
Если осмотр i-го пациента закончится после окончания времени приема доктора t1, то (i + 1) - ый пациент уже на прием попасть не сможет.
if (s[i] +
b[i] >= t2) break;
Если в момент времени s[i] + b[i] в очереди никого нет (только что закончился осмотр i-го пациента), то Петя может прийти в
этот момент в поликлинику и сразу попасть к врачу (ожидать ему не придется ни
минуты).
if (s[i] +
b[i] <= a[i+1])
{
printf("%d\n",s[i]
+ b[i]);
return 0;
}
(i
+ 1) - ый пациент уже стоит в очереди (он пришел раньше времени s[i] + b[i]), но только сейчас может попасть на прием.
s[i+1] = s[i] + b[i];
}
Пете есть смысл приходить в
поликлинику вместе с некоторым посетителем, то есть в некоторый момент времени ai. При этом ждать
ему придется s[i] – a[i] минут. Ищем i, для которого эта разность принимает наименьшее значение.
for(min = 0x3FFFFFFF, i = 1; s[i]
&& (i <= n); i++)
if (s[i] -
a[i] < min)
{
min = s[i] - a[i];
t = a[i];
}
Выводим наименьший
момент времени t, когда Петя Пяточкин
должен прийти в поликлинику.
printf("%d\n",t);